﻿using System.Collections.Generic;
using System.Web;

/// <summary>
/// 컨텍스트에서 다른 값과 충돌할 가능성이 매우 적은
/// 정보를 저장하는 도우미 클래스
/// 
/// 이 도우미에 저장된 데이터는 요청이 있는 동안에만
/// 활성화됩니다.
/// </summary>
public static class RequestData {
    // 컨텍스트에서 가짜 네임스페이스로 사용할 키
    private static readonly object _key = new object();

    /// <summary>
    /// 네임스페이스에 저장된 전체 정보 컬렉션을
    /// 가져옵니다.
    /// </summary>
    /// <returns>설정 디렉터리</returns>
    private static IDictionary<string, object> GetSettings() {
        return GetSettings(new HttpContextWrapper(HttpContext.Current));
    }

    internal static IDictionary<string, object> GetSettings(HttpContextBase context) {
        var settings = context.Items[_key] as IDictionary<string, object>;

        if (settings == null) {
            // 만들 예정입니다.
            settings = new Dictionary<string, object>();
            context.Items[_key] = settings;
        }

        return settings;
    }

    // 컨텍스트에 저장된 항목의 제네릭 개체를 가져옵니다.
    public static object GetValue(string key) {
        return GetValue<object>(new HttpContextWrapper(HttpContext.Current), key);
    }

    public static TValue GetValue<TValue>(string key) {
        return GetValue<TValue>(new HttpContextWrapper(HttpContext.Current), key);
    }

    internal static TValue GetValue<TValue>(HttpContextBase context, string key) {
        var settings = GetSettings(context);
        object value;

        if (settings.TryGetValue(key, out value)) {
            return (TValue)value;
        }

        return default(TValue);
    }

    public static void SetValue(string key, object value) {
        SetValue(new HttpContextWrapper(HttpContext.Current), key, value);
    }

    internal static void SetValue(HttpContextBase context, string key, object value) {
        var settings = GetSettings(context);
        settings[key] = value;
    }
}